package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import Model.Datos;
import Model.Paquete;
import Model.Servicio;
import Model.Sms;
import Model.Voz;

public class AdministradorPersistenciaServicio {
	private static AdministradorPersistenciaServicio instancia;
	
	private AdministradorPersistenciaServicio(){
		
	}
	
	public static AdministradorPersistenciaServicio getInstancia(){
		if(instancia == null)
			instancia = new AdministradorPersistenciaServicio();
		return instancia;
	}
	
	public void insert(Servicio s){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "INSERT INTO Servicios(descripcion, precio, unidadMedida) VALUES(?,?,?)";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setString(1, s.getDescripcion());
			ps.setFloat(2, s.getPrecio());
			ps.setString(3, s.getUnidadMedida());
			
			ps.execute();
			
			PoolConnection.getPoolConnection().releaseConnection(con);			
			
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
	}
	
	public void insertPaquete(Paquete p){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "INSERT INTO Paquete(descripcion, descuento, descripcionServicio) VALUES(?,?)";
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			for(Servicio s : p.getServicios()){
				ps.setString(1, p.getDescripcion());
				ps.setFloat(2, p.getDescuento());
				ps.setString(3, s.getDescripcion());
				
				ps.execute();
			}
			
			PoolConnection.getPoolConnection().releaseConnection(con);
		} catch (SQLException e) {			
			e.printStackTrace();
		}		
	}
	
	public void update(Servicio s){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "UPDATE Servicios SET precio = ?, unidadMedida = ? WHERE descripcion = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setFloat(1, s.getPrecio());
			ps.setString(2, s.getUnidadMedida());
			ps.setString(3, s.getDescripcion());
			
			ps.execute();
			
			PoolConnection.getPoolConnection().releaseConnection(con);
		} catch (SQLException e) {		
			e.printStackTrace();
		}
		
	}
	
	public void delete(Servicio s){
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "DELETE FROM Servicios WHERE descripcion = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setString(1, s.getDescripcion());
			
			ps.execute();
			
			PoolConnection.getPoolConnection().releaseConnection(con);
		} catch (SQLException e) {		
			e.printStackTrace();
		}		
	}
	
	public Servicio buscar(String descripcion){
		Servicio servicio = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM Servicios WHERE descripcion = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setString(1, descripcion);
			
			ResultSet result = ps.executeQuery();
			while(result.next()){
				String unidadDeMedida = result.getString("unidadMedida");
				float precio = result.getFloat("precio");
				if(descripcion.equalsIgnoreCase("VOZ"))
					servicio = new Voz(precio, unidadDeMedida);
				else if(descripcion.equalsIgnoreCase("SMS"))
					servicio = new Sms(precio, unidadDeMedida);
				else if(descripcion.equalsIgnoreCase("DATOS"))
					servicio = new Datos(precio, unidadDeMedida);
			}
			
			result.close();
			PoolConnection.getPoolConnection().releaseConnection(con);
			
			return servicio;
			
		} catch (SQLException e) {			
			e.printStackTrace();
			return null;
		}
		
	}

	public Vector<Servicio> buscarTodos() {
		Vector<Servicio> servicios = new Vector<Servicio>();
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM Servicios";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ResultSet result = ps.executeQuery();
			
			while(result.next()){
				Servicio servicio = null;
				float precio = result.getFloat("precio");
				String descripcion = result.getString("descripcion");
				if(descripcion.equalsIgnoreCase("VOZ")){
					servicio = new Voz(precio,descripcion);
				}else if(descripcion.equalsIgnoreCase("SMS")){
					servicio = new Sms(precio,descripcion);
				}else if(descripcion.equalsIgnoreCase("DATOS")){
					servicio = new Datos(precio,descripcion);
				}
				if(servicio != null)
					servicios.add(servicio);
			}
			
			result.close();
			PoolConnection.getPoolConnection().releaseConnection(con);
			return servicios;
		} catch (SQLException e) {
			e.printStackTrace();
			return servicios;
		}
		
	}
	
	public Vector<Servicio> buscarServiciosPlan(int nroPlan){
		Vector<Servicio> servicios = new Vector<Servicio>();
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM PlanesServicio WHERE nroPlan = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setInt(1, nroPlan);
			
			ResultSet result = ps.executeQuery();
			
			while(result.next()){
				String descripcionServicio = result.getString("descripcionServicio");
				Servicio servicio = buscar(descripcionServicio);
				servicios.add(servicio);
			}
			
			result.close();
			PoolConnection.getPoolConnection().releaseConnection(con);
			
			return servicios;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		
	}
}
